package hr.ctg.domain.action;

import hr.ctg.domain.model.Korisnik;
import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Objava;
import hr.ctg.domain.model.Objekt;
import hr.ctg.domain.model.Otok;
import hr.ctg.domain.model.Park;
import hr.ctg.domain.model.TipObjave;
import hr.ctg.service.dao.KorisnikDAO;
import hr.ctg.service.dao.MjestoDAO;
import hr.ctg.service.dao.ObjavaDAO;
import hr.ctg.service.dao.ObjektDAO;
import hr.ctg.service.dao.OtokDAO;
import hr.ctg.service.dao.ParkDAO;
import hr.ctg.service.dao.TipObjaveDAO;
import hr.ctg.util.CacheUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.cache.CacheProvider;

@Scope(ScopeType.CONVERSATION)
@Name("objavaAction")
public class ObjavaAction {
	@In
	ObjavaDAO objavaDAO;
	@In
	TipObjaveDAO tipObjaveDAO;
	@In
	KorisnikDAO korisnikDAO;
	@In
	ObjektDAO objektDAO;
	@In
	MjestoDAO mjestoDAO;
	@In
	OtokDAO otokDAO;
	@In
	ParkDAO parkDAO;
	@SuppressWarnings("unchecked")
	@In
	CacheProvider cacheProvider;
	@In
	String currentLang;

	@SuppressWarnings("unused")
	@DataModel
	private List<Objava> objave;

	@DataModelSelection("objave")
	@In(required = false)
	@Out(required = false)
	Objava objava;

	@DataModel
	private List<Objava> objaveForPanel;

	@SuppressWarnings("unused")
	@DataModel
	private List<Objava> objaveByTip;

	@In(required = false)
	Korisnik korisnik;

	@RequestParameter
	Integer idObjekta;
	@RequestParameter
	Integer idMjesta;
	@RequestParameter
	Integer idOtoka;
	@RequestParameter
	Integer idParka;
	@RequestParameter
	Integer tip;

	private String back;

	@Begin
	public String addSetup(final String back) {
		this.back = back;
		return "addObjava";
	}

	@Transactional
	@End(beforeRedirect = true)
	@Restrict("#{identity.loggedIn}")
	public String add() {
		Objekt objekt = null;
		Mjesto mjesto = null;
		Otok otok = null;
		Park park = null;
		if (idObjekta != null) {
			objekt = objektDAO.find(idObjekta);
		} else if (idMjesta != null) {
			mjesto = mjestoDAO.find(idMjesta);
		} else if (idParka != null) {
			park = parkDAO.find(idParka);
		} else {
			otok = otokDAO.find(idOtoka);
		}

		objava.setDatum(new Date());
		objava.setKorisnik(korisnik);
		if (objekt != null) {
			objava.setObjekt(objekt);
		} else if (mjesto != null) {
			objava.setMjesto(mjesto);
		} else if (park != null) {
			objava.setPark(park);
		} else {
			objava.setOtok(otok);
		}

		objavaDAO.merge(objava);

		if (objekt != null) {
			CacheUtil.clearCache(objekt, currentLang);
		}
		if (mjesto != null) {
			CacheUtil.clearCache(mjesto, currentLang);

		}
		if (otok != null) {
			CacheUtil.clearCache(otok, currentLang);

		}
		if (park != null) {
			CacheUtil.clearCache(park, currentLang);

		}

		return back;
	}

	@Factory("tipoviObjave")
	public List<TipObjave> getAllTipobiObjave() {
		return tipObjaveDAO.findAll();
	}

	@SuppressWarnings("unchecked")
	@Factory("objaveByArticles")
	public List<Objava> getObjavaByArticles() {
		if (idObjekta != null) {
			return objavaDAO.findByIdTipaObjaveIdObjekta(1, idObjekta);
		} else if (idMjesta != null) {
			return objavaDAO.findByIdTipaObjaveIdMjesta(1, idMjesta);
		} else if (idOtoka != null) {
			return objavaDAO.findByIdTipaObjaveIdOtoka(1, idOtoka);
		} else if (idParka != null) {
			return objavaDAO.findByIdTipaObjaveIdParka(1, idParka);
		}
		return Collections.EMPTY_LIST;
	}

	@SuppressWarnings("unchecked")
	@Factory("objaveByGuides")
	public List<Objava> getObjavaByGuides() {
		if (idObjekta != null) {
			return objavaDAO.findByIdTipaObjaveIdObjekta(2, idObjekta);
		} else if (idMjesta != null) {
			return objavaDAO.findByIdTipaObjaveIdMjesta(2, idMjesta);
		} else if (idOtoka != null) {
			return objavaDAO.findByIdTipaObjaveIdOtoka(2, idOtoka);
		} else if (idParka != null) {
			return objavaDAO.findByIdTipaObjaveIdParka(2, idParka);
		}
		return Collections.EMPTY_LIST;
	}

	@SuppressWarnings("unchecked")
	@Factory("objaveByReviews")
	public List<Objava> getObjaveByReviews() {
		if (idObjekta != null) {
			return objavaDAO.findByIdTipaObjaveIdObjekta(3, idObjekta);
		} else if (idMjesta != null) {
			return objavaDAO.findByIdTipaObjaveIdMjesta(3, idMjesta);
		} else if (idOtoka != null) {
			return objavaDAO.findByIdTipaObjaveIdOtoka(3, idOtoka);
		} else if (idParka != null) {
			return objavaDAO.findByIdTipaObjaveIdParka(3, idParka);
		}
		return Collections.EMPTY_LIST;
	}

	@Factory("objaveByTip")
	public void getObjaveByTip() {
		if (idObjekta != null) {
			objave = objavaDAO.findByIdTipaObjaveIdObjekta(tip, idObjekta);
		} else if (idMjesta != null) {
			objave = objavaDAO.findByIdTipaObjaveIdMjesta(tip, idMjesta);
		} else if (idOtoka != null) {
			objave = objavaDAO.findByIdTipaObjaveIdOtoka(tip, idOtoka);
		} else if (idParka != null) {
			objave = objavaDAO.findByIdTipaObjaveIdParka(tip, idParka);
		} else {
			objave = objavaDAO.findByIdKorisnika(korisnik.getIdKorisnika());
		}
	}

	@Factory("objaveForPanel")
	public void getObjaveForPanel() {
		objaveForPanel = new ArrayList<Objava>();
		for (int i = 1; i <= 3; i++) {
			if (idObjekta != null) {
				objaveForPanel.addAll(objavaDAO.findByIdTipaObjaveIdObjekta(i,
						idObjekta, 2));
			} else if (idMjesta != null) {
				objaveForPanel.addAll(objavaDAO.findByIdTipaObjaveIdMjesta(i,
						idMjesta, 2));
			} else if (idOtoka != null) {
				objaveForPanel.addAll(objavaDAO.findByIdTipaObjaveIdOtoka(i,
						idOtoka, 2));
			} else if (idParka != null) {
				objaveForPanel.addAll(objavaDAO.findByIdTipaObjaveIdParka(i,
						idParka, 2));
			} else {

			}
		}
	}

	@Factory("objave")
	public void getObjave() {
		if (idObjekta != null) {
			objave = objavaDAO.findByIdObjekta(idObjekta);
		} else if (idMjesta != null) {
			objave = objavaDAO.findByIdMjesta(idMjesta);
		} else if (idOtoka != null) {
			objave = objavaDAO.findByIdOtoka(idOtoka);
		} else if (idParka != null) {
			objave = objavaDAO.findByIdParka(idParka);
		} else {
			objave = objavaDAO.findByIdKorisnika(korisnik.getIdKorisnika());
		}
	}

	@End
	public String back() {
		return back;
	}

	@Begin(join = true)
	public String editSetup(final String back) {
		this.back = back;

		return "editObjava";
	}

	@End()
	public String edit() {
		objavaDAO.merge(objava);
		return back;
	}

	@End(beforeRedirect = true)
	public String delete() {
		objava = objavaDAO.merge(objava);
		objavaDAO.remove(objava);

		return back;
	}
}
